#include "qprinttools.h"

QPrintTools::QPrintTools(QObject *parent) : QObject(parent)
{
    L = new QLua;
}

QPrintTools::~QPrintTools()
{
    this->deleteLater();
}

QString QPrintTools::Product() const
{
    return m_Product;
}

void QPrintTools::setProduct(const QString &Product)
{
    m_Product = Product;
}

QString QPrintTools::Working() const
{
    return m_Working;
}

void QPrintTools::setWorking(const QString &Working)
{
    m_Working = Working;
}

int QPrintTools::Minnumber() const
{
    return m_Minnumber;
}

void QPrintTools::setMinnumber(int& Minnumber)
{
    if(Minnumber <= 0)
    {
        Minnumber = 0;
    }

    m_Minnumber = Minnumber;
}

int QPrintTools::Maxnumber() const
{
    return m_Maxnumber;
}

void QPrintTools::setMaxnumber(int& Maxnumber)
{
    if(m_Maxnumber < m_Minnumber)
    {
        Maxnumber += 1;
    }

    m_Maxnumber = Maxnumber;
}

QString QPrintTools::ProNumber() const
{
    return m_ProNumber;
}

void QPrintTools::setProNumber(const QString &ProNumber)
{
    bool bRet;
    int min = ProNumber.toInt(&bRet, 10);
    if(bRet)
    {
        m_ProNumber = QString("%1").arg(min, 4, 10, QLatin1Char('0'));
    }
    else
    {
        m_ProNumber = "0000";
    }
}

/**
 * @brief 将打印任务转换为消息
 *
 * 本函数根据是否需要打印多份文档来执行不同的逻辑。如果需要打印多份（b为true），
 * 则会遍历一个数字范围来生成和发送命令。如果只需要打印一份（b为false），则只生成
 * 和发送一个命令。在没有连接设备时，会发送错误日志并返回。
 *
 * @param b 指示是否需要打印多份文档的布尔值
 */
void QPrintTools::toMessage(bool b)
{
    //QDebug() << "QPrintTool 线程" << QThread::currentThreadId();

    // 检查是否有连接设备
    if(!this->IsLine)
    {
        emit SendLog("没有连接设备", 1);
        return;
    }

    QString cmd = "";

    // 根据b的值决定执行单次还是多次打印命令
    if(b)
    {
        // 遍历数字范围，生成和发送多个打印命令
        for(int min = m_Minnumber; min <= m_Maxnumber; min ++)
        {
            //QMutexLocker locker(&mutex);
            cmd = L->GetCommand(m_Product, m_Working, QString("%1").arg(min, 4, 10, QLatin1Char('0')));
            emit SendCommand(cmd);
            QThread::sleep(1);
            cmd = QString("%1-%2-%3").arg(this->m_Product).arg(this->m_Working).arg(min, 4, 10, QLatin1Char('0'));
            emit SendLog(cmd, 3);
        }
    }
    else
    {
        // 生成和发送单个打印命令
        cmd = L->GetCommand(m_Product, m_Working, QString("%1").arg(m_Minnumber, 4, 10, QLatin1Char('0')));
        emit SendCommand(cmd);
        cmd = QString("%1-%2-%3").arg(this->m_Product).arg(this->m_Working).arg(this->m_Minnumber, 4, 10, QLatin1Char('0'));
        emit SendLog(cmd, 3);
    }
}

/**
 * 将命令转换为消息格式并发送
 * 此函数用于将给定的命令列表转换为标准消息格式，并根据当前连接状态发送命令
 *
 * @param command 包含命令的字符串列表，这些命令将被转换和发送
 */
void QPrintTools::toMessages(QStringList command)
{
    // 获取当前日期，格式为年-日-月
    QString dat = QDateTime::currentDateTime().toString("yyyy-dd-MM");

    // 初始化一个临时列表，用于构造消息
    QStringList tmplist = {};
    // 向临时列表中添加日期、产品信息、工作信息和程序编号
    tmplist << dat << m_Product << m_Working << m_ProNumber;

    // 检查是否连接了设备
    if(!this->IsLine)
    {
        // 如果没有连接设备，发送日志消息并返回
        emit SendLog("没有连接设备", 1);
        return;
    }
    else
    {
        // 遍历命令列表中的每个命令
        foreach(const QString &s, command)
        {
            // 将命令添加到临时列表中
            tmplist.append(s);
            // 根据临时列表获取命令字符串
            QString cmd = L->GetCmd(tmplist);
            // 发送命令
            emit SendCommand(cmd);
            // 移除临时列表中的最后一个元素，以准备下一次迭代
            tmplist.removeLast();
            // 等待1秒，以确保命令处理的时间
            QThread::sleep(1);
        }
        // 根据命令数量发送完成消息
        if(command.length() > 1)
        {
            emit SendOver(1);
        }
        else
        {
            emit SendOver(0);
        }
    }
}

void QPrintTools::SetLineStatus(bool b)
{
    this->IsLine = b;
}
